using System;
namespace ICSharpCode.SharpZipLib.Checksums
{
	public class StrangeCRC : IChecksum
	{
		private static readonly uint[] crc32Table = new uint[]
		{
			0u,
			79764919u,
			159529838u,
			222504665u,
			319059676u,
			398814059u,
			445009330u,
			507990021u,
			638119352u,
			583659535u,
			797628118u,
			726387553u,
			890018660u,
			835552979u,
			1015980042u,
			944750013u,
			1276238704u,
			1221641927u,
			1167319070u,
			1095957929u,
			1595256236u,
			1540665371u,
			1452775106u,
			1381403509u,
			1780037320u,
			1859660671u,
			1671105958u,
			1733955601u,
			2031960084u,
			2111593891u,
			1889500026u,
			1952343757u,
			2552477408u,
			2632100695u,
			2443283854u,
			2506133561u,
			2334638140u,
			2414271883u,
			2191915858u,
			2254759653u,
			3190512472u,
			3135915759u,
			3081330742u,
			3009969537u,
			2905550212u,
			2850959411u,
			2762807018u,
			2691435357u,
			3560074640u,
			3505614887u,
			3719321342u,
			3648080713u,
			3342211916u,
			3287746299u,
			3467911202u,
			3396681109u,
			4063920168u,
			4143685023u,
			4223187782u,
			4286162673u,
			3779000052u,
			3858754371u,
			3904687514u,
			3967668269u,
			881225847u,
			809987520u,
			1023691545u,
			969234094u,
			662832811u,
			591600412u,
			771767749u,
			717299826u,
			311336399u,
			374308984u,
			453813921u,
			533576470u,
			25881363u,
			88864420u,
			134795389u,
			214552010u,
			2023205639u,
			2086057648u,
			1897238633u,
			1976864222u,
			1804852699u,
			1867694188u,
			1645340341u,
			1724971778u,
			1587496639u,
			1516133128u,
			1461550545u,
			1406951526u,
			1302016099u,
			1230646740u,
			1142491917u,
			1087903418u,
			2896545431u,
			2825181984u,
			2770861561u,
			2716262478u,
			3215044683u,
			3143675388u,
			3055782693u,
			3001194130u,
			2326604591u,
			2389456536u,
			2200899649u,
			2280525302u,
			2578013683u,
			2640855108u,
			2418763421u,
			2498394922u,
			3769900519u,
			3832873040u,
			3912640137u,
			3992402750u,
			4088425275u,
			4151408268u,
			4197601365u,
			4277358050u,
			3334271071u,
			3263032808u,
			3476998961u,
			3422541446u,
			3585640067u,
			3514407732u,
			3694837229u,
			3640369242u,
			1762451694u,
			1842216281u,
			1619975040u,
			1682949687u,
			2047383090u,
			2127137669u,
			1938468188u,
			2001449195u,
			1325665622u,
			1271206113u,
			1183200824u,
			1111960463u,
			1543535498u,
			1489069629u,
			1434599652u,
			1363369299u,
			622672798u,
			568075817u,
			748617968u,
			677256519u,
			907627842u,
			853037301u,
			1067152940u,
			995781531u,
			51762726u,
			131386257u,
			177728840u,
			240578815u,
			269590778u,
			349224269u,
			429104020u,
			491947555u,
			4046411278u,
			4126034873u,
			4172115296u,
			4234965207u,
			3794477266u,
			3874110821u,
			3953728444u,
			4016571915u,
			3609705398u,
			3555108353u,
			3735388376u,
			3664026991u,
			3290680682u,
			3236090077u,
			3449943556u,
			3378572211u,
			3174993278u,
			3120533705u,
			3032266256u,
			2961025959u,
			2923101090u,
			2868635157u,
			2813903052u,
			2742672763u,
			2604032198u,
			2683796849u,
			2461293480u,
			2524268063u,
			2284983834u,
			2364738477u,
			2175806836u,
			2238787779u,
			1569362073u,
			1498123566u,
			1409854455u,
			1355396672u,
			1317987909u,
			1246755826u,
			1192025387u,
			1137557660u,
			2072149281u,
			2135122070u,
			1912620623u,
			1992383480u,
			1753615357u,
			1816598090u,
			1627664531u,
			1707420964u,
			295390185u,
			358241886u,
			404320391u,
			483945776u,
			43990325u,
			106832002u,
			186451547u,
			266083308u,
			932423249u,
			861060070u,
			1041341759u,
			986742920u,
			613929101u,
			542559546u,
			756411363u,
			701822548u,
			3316196985u,
			3244833742u,
			3425377559u,
			3370778784u,
			3601682597u,
			3530312978u,
			3744426955u,
			3689838204u,
			3819031489u,
			3881883254u,
			3928223919u,
			4007849240u,
			4037393693u,
			4100235434u,
			4180117107u,
			4259748804u,
			2310601993u,
			2373574846u,
			2151335527u,
			2231098320u,
			2596047829u,
			2659030626u,
			2470359227u,
			2550115596u,
			2947551409u,
			2876312838u,
			2788305887u,
			2733848168u,
			3165939309u,
			3094707162u,
			3040238851u,
			2985771188u
		};
		private int globalCrc;
		public long Value
		{
			get
			{
				return (long)(~(long)this.globalCrc);
			}
		}
		public StrangeCRC()
		{
			this.Reset();
		}
		public void Reset()
		{
			this.globalCrc = -1;
		}
		public void Update(int value)
		{
			int num = this.globalCrc >> 24 ^ value;
			if (num < 0)
			{
				num = 256 + num;
			}
			this.globalCrc = (int)((long)((long)this.globalCrc << 8) ^ (long)((ulong)StrangeCRC.crc32Table[num]));
		}
		public void Update(byte[] buffer)
		{
			if (buffer == null)
			{
				throw new ArgumentNullException("buffer");
			}
			this.Update(buffer, 0, buffer.Length);
		}
		public void Update(byte[] buffer, int offset, int count)
		{
			if (buffer == null)
			{
				throw new ArgumentNullException("buffer");
			}
			if (offset < 0)
			{
				throw new ArgumentOutOfRangeException("offset", "cannot be less than zero");
			}
			if (count < 0)
			{
				throw new ArgumentOutOfRangeException("count", "cannot be less than zero");
			}
			if (offset + count > buffer.Length)
			{
				throw new ArgumentOutOfRangeException("count");
			}
			for (int i = 0; i < count; i++)
			{
				this.Update((int)buffer[offset++]);
			}
		}
	}
}
